<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>提升</title>
    <script>
        /* 
            变量的提升
                使用var声明的变量，会在所有代码执行前被声明，但不会被赋值。
                所以可以在变量声明前访问变量，访问出来也是undefined

        */

        console.log(a)      // undefined
        // console.log(b)      // b is not defined
        var a = 10
        b = 1
        console.log(a)      // 10
        console.log(b)      // 1   


        /* 
            函数的提升
                使用函数声明创建的函数，会在其它代码执行前被创建,如果在前面调用，会直接被执行。
                所以可以在函数声明前调用函数，但是箭头函数和函数表达式创建的函数不行。
        
        
        
        */

        fn1()
        //fn2()       // 报错 ReferenceError: Cannot access 'fn2' before initialization
        //fn3()       // 报错 ReferenceError: Cannot access 'fn3' before initialization

        function fn1() {
            console.log('函数声明创建的函数fn1')
        }

        const fn2 = function () {
            console.log('函数表达式创建的函数fn2')
        }

        const fn3 = () => {
            console.log('箭头函数创建的函数fn3')
        }


        // let 声明的变量虽然也提升了，但是赋值之前，解释器禁止对该变量的访问。

        console.log(c)  //  如果没提升，应该报错是c is not defined。但是报Cannot access 'c' before initialization，说明他提升了。
        let c = 10
    </script>
</head>

<body>

</body>

</html>